﻿using BasicsClassLibrary.Tool.Configure;
using Consul;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BasicsClassLibrary.Tool.ConsulSet
{
    public static class RegisterToConsul
    {
        /// <summary>
        /// 把本服务注册到Consul
        /// </summary>
        /// <param name="config">参数配置</param>
        /// <param name="appLifetime">程序生命周期</param>
        public static void RegToConsul(this IConfiguration config)
        {
            //Consul地址
            var address= AppHelper.ReadAppSettings("Consul", "consulAddress"); 
            var consulClient = new ConsulClient(p => { p.Address = new Uri(address); });

            //本地IP
            var localIP = AppHelper.ReadAppSettings("Consul", "currentIp");
            //本地服务端口
            var localPort = Convert.ToInt32(AppHelper.ReadAppSettings("Consul", "currentPort")); //端口号从命令行参数获取（注：目前没找到直接获取本服务监听的端口的方法）

            //心跳检测设置
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60), //心跳检测失败多久后注销
                Interval = TimeSpan.FromSeconds(10), //间隔多久心跳检测一次
                HTTP = $"http://{localIP}:9998/health", //心跳检查地址，本服务提供的地址
                Timeout = TimeSpan.FromSeconds(5)  //心跳检测超时时间
            };

            //服务名（这里通过命令行参数传入不同的服务名，模拟我们有不同的服务[其实只是同一个接口项目的不同运行实例]）
            var serviceName = AppHelper.ReadAppSettings("Consul", "serviceName");

            //注册信息
            var registration = new AgentServiceRegistration()
            {
                ID = $"{localIP}:{localPort}", //服务ID，唯一
                Name = serviceName, //服务名（如果服务搭集群，它们的服务名应该是一样的，但是ID不一样）
                Address = $"{localIP}", //服务地址
                Port = localPort, //服务端口
                Tags = new[] { $"urlprefix-/{serviceName} strip=/{serviceName}" }, //服务标签，一般可以用来设置权重等本地服务特有信息,fabio规则适用
                Checks = new[] { httpCheck }, //心跳检测设置
            };

            //向Consul注册服务
            consulClient.Agent.ServiceRegister(registration).Wait();

        }
    }
}
